local counter_count_key = KEYS[1]
local counter_timestamp_key = KEYS[2]
local verify_captcha_id = KEYS[3]
--  每秒最大请求数量
local verify_captcha_threshold = tonumber(ARGV[1])
local current_time_millis = tonumber(ARGV[2])
local verify_captcha_id_expire_time = tonumber(ARGV[3])
--  始终开启验证码校验开关：0不开启  1开启
local always_verify_captcha = tonumber(ARGV[4])
--  时间窗口大小：1000ms
local differenceValue = 1000
--  如果设置直接开启验证码验证开关，直接返回结果，不需要进行阈值判断
if always_verify_captcha == 1 then
    redis.call('set', verify_captcha_id,'yes')
    redis.call('expire',verify_captcha_id,verify_captcha_id_expire_time)
    return 'true'
end
--  获取当前计数和上次重置时间
local count = tonumber(redis.call('get', counter_count_key) or "0")
local lastResetTime = tonumber(redis.call('get', counter_timestamp_key) or "0")
--  检查时间窗口是否已过，如果已过，重置计数和时间戳
if current_time_millis - lastResetTime > differenceValue then
    count = 0
    redis.call('set', counter_count_key, count)
    redis.call('set', counter_timestamp_key, current_time_millis)
end
-- 在时间窗口内，更新计数
count = count + 1
-- 超过阈值，开启验证码验证
if count > verify_captcha_threshold then
    count = 0
    redis.call('set', counter_count_key, count)
    redis.call('set', counter_timestamp_key, current_time_millis)
    -- 设置校验验证码标识为yes
    redis.call('set', verify_captcha_id,'yes')
    redis.call('expire',verify_captcha_id,verify_captcha_id_expire_time)
    return 'true'
end
-- count 未超过阈值，更新计数
redis.call('set', counter_count_key, count)
-- 当前时刻请求未超过阈值，不需要验证码操作
redis.call('set',verify_captcha_id,'no')
redis.call('expire',verify_captcha_id,verify_captcha_id_expire_time)
return 'false'
